package InterfaceSeccao;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Polygon;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author aluno
 */
public class Figura extends javax.swing.JPanel {

    private int eixoX = 20;
    private int eixoY = 20;
    private int centroX;
    private int centroY;
    private Dados dados;

    /** Creates new form Figura */
    public Figura() {
        dados = new Dados();
        centroY = (int) this.getHeight()/2;
        centroX = (int) this.getWidth()/2;
        this.setBorder(javax.swing.BorderFactory.createEtchedBorder());
    }
    //0 Limpo
    //1 Retangulo
    //2 Triangulo
    //3 Circulo
    private int tipo = 0;
    private int altura;
    private int largura;//retirar depois
    private int base;//modificar a variavel largura
    private int raio;
    private int[] xs;
    private int[] ys;
    private double fator = 1;
    private int[] xPoints = new int[3];
    private int[] yPoints = new int[3];
    private int xx;
    private int yy;

    public double getFator() {
        return fator;
    }

    public void setFator(double fator) {
        this.fator = fator;
        dados.fator = fator;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        int y = this.getHeight() / 2 - altura / 2;
        int x = this.getWidth() / 2 - largura / 2;
        g.setColor(Color.black);
        int y2 = this.getHeight() / 2 - raio;
        int x2 = this.getWidth() / 2 - raio;
        //altura=(int) (altura*fator);
        //largura= (int) (largura*fator);

        // g.
        switch (dados.tipo) {
            case 0:
                repaint();
                break;
            case 1: // Retangulo VER FUNCAO RETANGULO
                g.drawRect(xx, yy, ((int) (dados.base)), ((int) (dados.altura)));
                g.setColor(Color.red);
                break;
            case 2: //Triangulo VER FUNCAO TRIANGULO()
                g.drawPolygon(xPoints, yPoints, 3);
                break;
            case 3: // Circulo
                g.drawOval((int) (xx), (int) (yy), (int) (2*dados.raio),(int) (2*dados.raio));
                g.setColor(Color.blue);
                break;
            case 4: // Semi Circulo
                g.drawArc(xx, yy,(int) (dados.raio * 2), (int) (dados.raio * 2), 0, 180);
                g.drawLine(xx, yy + (int) (dados.raio), xx + (int) (dados.raio * 2), yy + (int) (dados.raio));
                //g.drawOval(x, y, altura, largura);
                break;
            case 5: // 1/4 Ciculo
                g.drawArc(xx, yy, (int) (dados.raio * 2), (int) (dados.raio * 2), 0, 90);
                g.drawLine(xx + (int) (dados.raio), yy, xx + (int) (dados.raio), yy + (int) (dados.raio));
                g.drawLine(xx + (int) (dados.raio), yy + (int) (dados.raio), xx + (int) (dados.raio * 2), yy + (int) (dados.raio));
                //g.drawLine(x2, y2+raio, x2+raio*2, y2+raio);
                break;
            case 6: // Outros Poligonos
                int np = xs.length;
                g.drawPolygon(xs, ys, np);
                break;

        }
    }

    public void desenhaCirculo(double raio) {
        dados.raio = (float) raio;
        dados.tipo = 3;
        dados.atualiza();
        circulo();

//        altura = (int) raio * 2;
//        largura = (int) raio * 2;
//        tipo = 3;
//        this.repaint();
        //this.validateTree();
    }

    public void desenhaSemiCirculo(double raio) {
        dados.raio = (float) raio;
        dados.tipo = 4;
        dados.atualiza();
        semiCirculo();

//        altura = (int) raio * 2;
//        largura = (int) raio * 2;
//        this.raio = (int) raio;
//        tipo = 4;
//        this.repaint();
        //TODO 
    }

    public void desenhaQuadrante(double raio) {
        dados.raio = (float) raio;
        dados.tipo = 5;
        dados.atualiza();
        quadrante();

//        altura = (int) raio * 2;
//        largura = (int) raio * 2;
//        this.raio = (int) raio;
//        tipo = 5;
//        this.repaint();
        //TODO
    }

    public void desenhaPoligono(int[] x, int[] y) {
        dados.xs = new int[x.length];
        dados.ys = new int[y.length];
        System.arraycopy(x, 0, dados.xs, 0, x.length);
        System.arraycopy(y, 0, dados.ys, 0, y.length);
        dados.tipo = 6;
        dados.atualiza();
        poligono();
        
//        xs = new int[y.length];
//        ys = new int[y.length];
//        for (int i = 0; i < y.length; i++) {
//            ys[i] = this.getHeight() - y[i] - eixoY;// +this.getHeight()
//            xs[i] = x[i] + eixoX;
//        }
        //tipo = 6;
        //this.repaint();
    }

    public void desenhaTriangulo(double baseL, double alturaH) {
        dados.base = (float) baseL;
        dados.altura = (float) alturaH;
        dados.tipo = 2;
        dados.atualiza();
        triangulo();

        //altura = (int) alturaH;
        //largura = (int) baseL;
        //tipo = 2;
        //this.repaint();
    }

    public void desenhaRetangulo(double baseL, double alturaH) {
        dados.base = (float) baseL;
        dados.altura = (float) alturaH;
        dados.tipo = 1;
        dados.atualiza();

        retangulo();
        
        //this.validateTree();
    }

    public void limpaTela() {
        dados.altura = 0;
        dados.base = 0;
        dados.tipo = 0;

        altura = 0;
        largura = 0;
        tipo = 0;
        this.repaint();
    }
    
    private void circulo(){
        centroY = (int) this.getHeight()/2;
        centroX = (int) this.getWidth()/2;
        xx = (int) (centroX - dados.raio);
        yy = (int) (centroY - dados.raio);        
        this.repaint();
    }
    
    private void retangulo(){
        centroY = (int) this.getHeight()/2;
        centroX = (int) this.getWidth()/2;
        xx = centroX - dados.centroX;
        yy = centroY - dados.centroY;
        
        this.repaint();        
    }

    private void triangulo() {
        centroY = (int) this.getHeight()/2;
        centroX = (int) this.getWidth()/2;
        base = (int) (dados.base * fator);
        altura = (int) (dados.altura * fator);
        int xp1 = centroX - dados.centroX;
        int xp2 = xp1 + base;
        int xp3 = xp1;
        int ypbase = centroY + dados.centroY;// - this.getHeight();
        //ypbase = ypbase*-1;
        int ypH = ypbase - altura;
        xPoints[0] = xp1;
        xPoints[1] = xp2;
        xPoints[2] = xp3;
        yPoints[0] = ypbase;
        yPoints[1] = ypbase;
        yPoints[2] = ypH;
        this.repaint();
        //g.drawPolygon(xPoints, yPoints, 3);

    }

    private void semiCirculo() {
        centroY = (int) this.getHeight()/2;
        centroX = (int) this.getWidth()/2;
        xx = (int) (centroX - dados.raio);
        yy = (int) (centroY - dados.raio + dados.centroY);        
        this.repaint();
        //throw new UnsupportedOperationException("Not yet implemented");
    }

    private void quadrante() {
        centroY = (int) this.getHeight()/2;
        centroX = (int) this.getWidth()/2;
        xx = (int) (centroX - dados.raio - dados.centroX);
        yy = (int) (centroY - dados.raio + dados.centroY);        
        this.repaint();
        //throw new UnsupportedOperationException("Not yet implemented");
    }

    private void poligono() {
        centroY = (int) this.getHeight()/2;
        centroX = (int) this.getWidth()/2;
        //xx = centroX - (dados.centroX - dados.xs[0]);
        //yy = centroY - (dados.centroY - dados.ys[0]);
        xs = new int[dados.xs.length];
        ys = new int[dados.xs.length];
        for (int i = 0; i < xs.length; i++) {
            xs[i] = centroX - (int)(dados.fator*(dados.centroX - dados.xs[i]));
            ys[i] = centroY + (int)(dados.fator*(dados.centroY - dados.ys[i]));
            //ys[i] = this.getHeight() - y[i] - eixoY;// +this.getHeight()
            //xs[i] = x[i] + eixoX;
        }
        this.repaint();
        //throw new UnsupportedOperationException("Not yet implemented");
    }
}
